<?php

// PHP雪里开轻量级报修系统 V1.0Beta
// 演示地址: http://baoxiu.chalide.cn
// 更新关注: /weivote
// 文件路径: sys/inxs.php
// 文件大小: 11236 字节
// 最后修改时间: 2025-05-21 15:42:34
// 作者: yujianyue
// 邮件: 15058593138@qq.com
// 版权所有,保留发行权和署名权

/**
 * 本文件功能：系统管理员-导入学生信息
 * 版权声明：保留发行权和署名权
 * 作者信息：功能反馈:15058593138@qq.com(手机号同微信)
 */

// 处理AJAX请求
if (isset($_GET['act'])) {
    switch ($_GET['act']) {
        case 'upload':
            // 上传TXT/CSV文件
            if (!isset($_FILES['file']) || $_FILES['file']['error'] != UPLOAD_ERR_OK) {
                json_error('文件上传失败');
            }
            
            $tmp_name = $_FILES['file']['tmp_name'];
            $name = $_FILES['file']['name'];
            $size = $_FILES['file']['size'];
            $type = $_FILES['file']['type'];
            
            // 检查文件大小
            if ($size > 5 * 1024 * 1024) { // 5MB
                json_error('文件大小不能超过5MB');
            }
            
            // 检查文件类型
            $ext = strtolower(pathinfo($name, PATHINFO_EXTENSION));
            if ($ext != 'txt' && $ext != 'csv') {
                json_error('只支持TXT和CSV格式文件');
            }
            
            // 移动到临时目录
            $target_dir = 'uploads/';
            if (!is_dir($target_dir) && !mkdir($target_dir, 0755, true)) {
                json_error('无法创建上传目录');
            }
            
            $target_file = $target_dir . date('YmdHis') . '_' . $name;
            if (!move_uploaded_file($tmp_name, $target_file)) {
                json_error('文件保存失败');
            }
            
            json_success('文件上传成功', ['file' => $target_file]);
            break;
            
        case 'import':
            // 导入学生数据
            $file = isset($_POST['file']) ? trim($_POST['file']) : '';
            
            if (empty($file) || !file_exists($file)) {
                json_error('文件不存在');
            }
            
            // 读取文件数据
            $result = import_csv_data($file, function($row, $row_num) use ($db, $mysqli) {
                // 检查必填字段
                $required_fields = ['xuehao', 'realname', 'phone'];
                foreach ($required_fields as $field) {
                    if (empty($row[$field])) {
                        return "第 {$row_num} 行: {$field} 不能为空";
                    }
                }
                
                // 检查学号是否已存在
                $xuehao = $mysqli->real_escape_string($row['xuehao']);
                $check = $db->getOne('stux', "xuehao = '{$xuehao}'");
                if ($check) {
                    return "第 {$row_num} 行: 学号 {$xuehao} 已存在";
                }
                
                // 准备数据
                $data = [
                    'xuehao' => $xuehao,
                    'password' => md5($xuehao), // 默认密码与学号相同
                    'realname' => $row['realname'],
                    'phone' => $row['phone'],
                    'type' => isset($row['type']) && in_array($row['type'], ['学生', '后勤', '系统']) ? $row['type'] : '学生',
                    'status' => isset($row['status']) ? intval($row['status']) : 1,
                    'remark' => isset($row['remark']) ? $row['remark'] : '',
                    'create_time' => date('Y-m-d H:i:s')
                ];
                
                // 插入数据
                $result = $db->insert('stux', $data);
                if ($result) {
                    return true;
                } else {
                    return "第 {$row_num} 行: 插入失败 - " . $mysqli->error;
                }
            });
            
            // 导入完成后删除临时文件
            @unlink($file);
            
            json_success('导入完成', $result);
            break;
    }
    exit;
}
// 包含头部
include './inc/head.php';
?>

<div class="page-header">
    <h2 class="page-title">批量导入学生</h2>
    <div class="page-tools">
        <a href="?do=lius" class="btn btn-primary">返回用户列表</a>
    </div>
</div>

<div class="card mb-4">
    <div class="card-header">
        <h3>导入说明</h3>
    </div>
    <div class="card-body">
        <p>1. 请使用TXT或CSV格式文件，第一行为字段名，支持以下字段：</p>
        <ul>
            <li><strong>xuehao</strong>: 学号/工号 (必填，默认密码与学号相同)</li>
            <li><strong>realname</strong>: 姓名 (必填)</li>
            <li><strong>phone</strong>: 电话 (必填)</li>
            <li><strong>type</strong>: 用户类型，可选值: 学生、后勤、系统 (默认: 学生)</li>
            <li><strong>status</strong>: 状态，可选值: 1(正常)、0(禁用) (默认: 1)</li>
            <li><strong>remark</strong>: 备注 (选填)</li>
        </ul>
        <p>2. 文件可以直接从Excel复制数据，保存为TXT格式</p>
        <p>3. 文件最大支持5MB</p>
        <p>4. 导入过程中如遇到学号重复的记录会自动跳过</p>
        
        <div class="mt-3">
            <h4>示例格式：</h4>
            <pre>xuehao,realname,phone,type,status,remark
2023001,张三,13500000001,学生,1,
2023002,李四,13500000002,学生,1,
2023003,王五,13500000003,学生,1,</pre>
        </div>
    </div>
</div>

<div class="card">
    <div class="card-header">
        <h3>上传文件</h3>
    </div>
    <div class="card-body">
        <form id="uploadForm" enctype="multipart/form-data">
            <div class="form-group">
                <label for="file">选择文件</label>
                <input type="file" class="form-control" id="file" name="file" accept=".txt,.csv">
                <small class="form-text text-muted">支持TXT、CSV格式，最大5MB</small>
            </div>
            
            <div class="form-group">
                <button type="button" class="btn btn-primary" id="uploadBtn">上传并导入</button>
            </div>
        </form>
        
        <div id="importProgress" style="display: none;">
            <h4 class="mt-4">导入进度</h4>
            <div class="progress mb-3">
                <div class="progress-bar" role="progressbar" style="width: 0%;" id="progressBar">0%</div>
            </div>
            <div id="importResult"></div>
        </div>
    </div>
</div>

<script>
document.addEventListener('DOMContentLoaded', function() {
    // 上传并导入
    document.getElementById('uploadBtn').addEventListener('click', function() {
        var fileInput = document.getElementById('file');
        
        if (!fileInput.files || fileInput.files.length === 0) {
            showToast('请选择文件', 'warning');
            return;
        }
        
        var file = fileInput.files[0];
        var formData = new FormData();
        formData.append('file', file);
        
        // 显示进度条
        var importProgress = document.getElementById('importProgress');
        var progressBar = document.getElementById('progressBar');
        var importResult = document.getElementById('importResult');
        
        importProgress.style.display = 'block';
        progressBar.style.width = '10%';
        progressBar.textContent = '10%';
        importResult.innerHTML = '<p>正在上传文件...</p>';
        
        // 禁用按钮
        var uploadBtn = this;
        uploadBtn.disabled = true;
        
        // 上传文件
        var xhr = new XMLHttpRequest();
        xhr.open('POST', '?do=inxs&act=upload', true);
        
        xhr.onreadystatechange = function() {
            if (xhr.readyState === 4) {
                if (xhr.status === 200) {
                    try {
                        var response = JSON.parse(xhr.responseText);
                        
                        if (response.status === 'success') {
                            // 更新进度
                            progressBar.style.width = '50%';
                            progressBar.textContent = '50%';
                            importResult.innerHTML += '<p>文件上传成功，正在导入数据...</p>';
                            
                            // 开始导入数据
                            importData(response.data.file);
                        } else {
                            showToast(response.msg, 'error');
                            progressBar.style.width = '0%';
                            progressBar.textContent = '0%';
                            importResult.innerHTML += '<p class="text-danger">上传失败: ' + response.msg + '</p>';
                            uploadBtn.disabled = false;
                        }
                    } catch (e) {
                        showToast('解析响应失败', 'error');
                        progressBar.style.width = '0%';
                        progressBar.textContent = '0%';
                        importResult.innerHTML += '<p class="text-danger">上传失败: 解析响应失败</p>';
                        uploadBtn.disabled = false;
                    }
                } else {
                    showToast('请求失败', 'error');
                    progressBar.style.width = '0%';
                    progressBar.textContent = '0%';
                    importResult.innerHTML += '<p class="text-danger">上传失败: 请求失败</p>';
                    uploadBtn.disabled = false;
                }
            }
        };
        
        xhr.send(formData);
    });
    
    // 导入数据
    function importData(file) {
        var progressBar = document.getElementById('progressBar');
        var importResult = document.getElementById('importResult');
        var uploadBtn = document.getElementById('uploadBtn');
        
        ajax('?do=inxs&act=import', {file: file}, function(response) {
            if (response.status === 'success') {
                // 更新进度
                progressBar.style.width = '100%';
                progressBar.textContent = '100%';
                
                // 显示导入结果
                var result = response.data;
                var html = '<h4>导入结果</h4>';
                html += '<p>成功: ' + result.success + ' 条记录</p>';
                html += '<p>失败: ' + result.error + ' 条记录</p>';
                
                if (result.error > 0 && result.errors.length > 0) {
                    html += '<h5>错误详情:</h5>';
                    html += '<ul>';
                    for (var i = 0; i < result.errors.length; i++) {
                        html += '<li>' + result.errors[i] + '</li>';
                    }
                    html += '</ul>';
                }
                
                importResult.innerHTML += html;
                showToast('导入完成', 'success');
            } else {
                progressBar.style.width = '50%';
                progressBar.textContent = '50%';
                importResult.innerHTML += '<p class="text-danger">导入失败: ' + response.msg + '</p>';
                showToast(response.msg, 'error');
            }
            
            // 恢复按钮状态
            uploadBtn.disabled = false;
        });
    }
});
</script>
